package ru.bazunaka.bazbloglite.Usecase.impl;

import org.springframework.stereotype.Component;
import ru.bazunaka.bazbloglite.Entity.Tweet;
import ru.bazunaka.bazbloglite.Mapper.TweetAddRequestToTweetMapper;
import ru.bazunaka.bazbloglite.Mapper.TweetToTweetResponseMapper;
import ru.bazunaka.bazbloglite.Model.TweetAddRequest;
import ru.bazunaka.bazbloglite.Model.TweetResponse;
import ru.bazunaka.bazbloglite.Services.TweetService;
import ru.bazunaka.bazbloglite.Usecase.TweetAddCase;

/**
 * Фасада для добавления твитов.
 *
 * @author Андрей Сторожок.
 * @version 1.0
 */
@Component
public class TweetAddCaseFacade implements TweetAddCase {

    /**
     * Маппер для преобразования запроса на добавление твита в сущность Tweet.
     */
    private final TweetAddRequestToTweetMapper tweetAddRequestToTweetMapper;

    /**
     * Маппер для преобразования сущности Tweet в ответ на запрос на добавление твита.
     */
    private final TweetToTweetResponseMapper tweetToTweetResponseMapper;

    /**
     * Служба для работы с твитами.
     */
    private final TweetService tweetService;

    /**
     * Конструктор фасада добавления твитов.
     *
     * @param tweetAddRequestToTweetMapper маппер для преобразования запроса на добавление твита в сущность Tweet
     * @param tweetToTweetResponseMapper маппер для преобразования сущности Tweet в ответ на запрос на добавление твита
     * @param tweetService служба для работы с твитами
     */
    public TweetAddCaseFacade(TweetAddRequestToTweetMapper tweetAddRequestToTweetMapper,
                              TweetToTweetResponseMapper tweetToTweetResponseMapper,
                              TweetService tweetService) {
        this.tweetAddRequestToTweetMapper = tweetAddRequestToTweetMapper;
        this.tweetToTweetResponseMapper = tweetToTweetResponseMapper;
        this.tweetService = tweetService;
    }

    /**
     * Добавление твита.
     *
     * @param addRequest запрос на добавление твита
     * @return ответ на запрос на добавление твита
     */
    @Override
    public TweetResponse addTweet(TweetAddRequest addRequest) {
        Tweet mappedTweet = this.tweetAddRequestToTweetMapper.map(addRequest);
        Tweet createdTweet = this.tweetService.createTweet(mappedTweet);
        return this.tweetToTweetResponseMapper.map(createdTweet);
    }
}
